package keywords;

/**
 * @author shkstart
 * @date 2022/5/18 - 21:16
 */

/* * final:最终的
 *
 * 1. final可以用来修饰的结构：类、方法、变量
 *
 * 2. final 用来修饰一个类:此类不能被其他类所继承。
 *          比如：String类、System类、StringBuffer类
 *
 * 3. final 用来修饰方法：表明此方法不可以被重写
 * 			比如：Object类中getClass();
 *
 *  4. final 用来修饰变量：此时的"变量"就称为是一个常量
 * 4.1 final修饰属性：可以考虑赋值的位置有：显式初始化、代码块中初始化、构造器中初始化

   4.2 final修饰局部变量：
 *  尤其是使用final修饰形参时，表明此形参是一个常量。
 *  当我们调用此方法时，给常量形参赋一个实参。一旦赋值
 *  以后，就只能在方法体内使用此形参，但不能进行重新赋值。
 *
 *  static final 用来修饰属性：全局常量                   //理解final常量：只需要final后的常量本身没有变化就ok！
 *  */
public class FinalTest {
    final int WIDTH = 0;
    final int LEFT;
    final int RIGHT;
//    final int DOWN;

    public FinalTest() {
        RIGHT = 2;
    }

    public FinalTest(int i) {
        RIGHT = 3;
    }

//    public void Violet(int DOWN) {
//        this.DOWN = DOWN;
//    }
//    final不能在方法中赋值，因为构造器是对象出生的最后一道关卡，构造器调完后，堆空间
//    相应的属性就加载了，这时候属性必须有值了(就必须告诉我们这些属性的值了)，
//    我们通过对象去调方法，只是说我们会对这个值再修改，那我们final后的属性是常量了，
//    就不能考虑修改的事了.


//    public FinalTest(int i) {
//
//    }     如果我定义了俩个构造器,且带形参的构造器中没给RIGHT 赋值 那么它会报错
//          因为我在创造对象的时候不一定new 的是空参构造器，也可能是带参的构造器
//          那么就会使RIGHT 没赋过值(因为定义了final的属性不能自动初始化)
//          从而导致程序报错,所以我必须赋值

    //    final修饰局部变量例子:
    public void show() {
        final int NUM = 10;
//        NUM += 2;
    }

    public void show1(final int num) {
//        int num = 10;
        int num1 = num;
        System.out.println(num1);
    }

    {
        LEFT = 1;
    }

    public static void main(String[] args) {
        FinalTest finalTest = new FinalTest();
//        finalTest.Violet(34);
        finalTest.show1(3);
    }
}

final class FinalA {

}

//class FinalB extends FinalA {
//
//}


class AA {
    public final void show() {

    }

}

//class BB extends AA {
//    public void show() {
//
//    }
//}
